// Dart 基础代码参考
// 包含基本数据类型、控制流、函数、集合操作、异步编程等核心内容

import 'dart:async';
import 'dart:math';

void main() {
  print('===== Dart 基础代码示例 =====');

  // 一、基本数据类型示例
  basicDataTypes();

  // 二、控制流示例
  controlFlowExamples();

  // 三、函数示例
  functionExamples();

  // 四、集合操作示例
  collectionOperations();

  // 五、异步编程示例
  asyncProgramming();

  // 六、数学计算示例
  mathCalculations();

  print('===== 示例执行完毕 =====');
}

/// 一、基本数据类型示例
void basicDataTypes() {
  print('\n--- 基本数据类型 ---');

  // 数值类型
  int integer = 42;
  double decimal = 3.14159;

  // 字符串类型
  String message = 'Hello, Dart!';
  String multiLine = """这是一个
多行字符串示例""";

  // 布尔类型
  bool isActive = true;
  bool isComplete = false;

  // 集合类型
  List<String> fruits = ['苹果', '香蕉', '橙子'];
  Set<int> uniqueNumbers = {1, 2, 3, 3, 4, 5};
  Map<String, int> person = {'name': 6, 'age': 25};

  // 打印数据
  print('整数: $integer');
  print('小数: $decimal');
  print('字符串: $message');
  print('多行字符串:\n$multiLine');
  print('布尔值: isActive=$isActive, isComplete=$isComplete');
  print('列表: $fruits');
  print('集合: $uniqueNumbers');
  print('映射: $person');
}

/// 二、控制流示例
void controlFlowExamples() {
  print('\n--- 控制流语句 ---');

  // if-else 语句
  int score = 85;
  String result = (score >= 90)
      ? '优秀'
      : (score >= 80)
          ? '良好'
          : '中等';
  print('考试成绩: $score, 评价: $result');

  // switch-case 语句
  String fruit = '香蕉';
  String fruitColor;

  switch (fruit) {
    case '苹果':
      fruitColor = '红色';
      break;
    case '香蕉':
      fruitColor = '黄色';
      break;
    case '葡萄':
      fruitColor = '紫色';
      break;
    default:
      fruitColor = '未知颜色';
  }

  print('$fruit 的颜色是: $fruitColor');

  // for 循环
  print('1到10的数字:');
  for (int i = 1; i <= 10; i++) {
    print(i);
  }

  // while 循环
  int count = 0;
  print('while 循环计数:');
  while (count < 5) {
    print(count);
    count++;
  }

  // for-in 循环 (遍历集合)
  List<String> languages = ['Dart', 'Flutter', 'Java', 'Python'];
  print('编程语言列表:');
  for (String lang in languages) {
    print('- $lang');
  }
}

/// 三、函数示例
void functionExamples() {
  print('\n--- 函数示例 ---');

  // 普通函数
  int addNumbers(int a, int b) {
    return a + b;
  }

  int sum = addNumbers(10, 15);
  print('10 + 15 = $sum');

  // 可选参数 - 位置参数
  String formatDate(int year, int month, [int? day]) {
    String dayStr = day != null ? '$day' : '未知';
    return '$year年$month月$dayStr日';
  }

  print(formatDate(2025, 6));
  print(formatDate(2025, 6, 25));

  // 可选参数 - 命名参数
  String userInfo({required String name, int? age, String? email}) {
    String info = '姓名: $name';
    if (age != null) info += ', 年龄: $age';
    if (email != null) info += ', 邮箱: $email';
    return info;
  }

  print(userInfo(name: '李四'));
  print(userInfo(name: '王五', age: 30, email: 'wang@example.com'));

  // 箭头函数
  double square(double x) => x * x;
  print('5的平方: ${square(5)}');

  // 匿名函数
  List<int> numbers = [1, 2, 3, 4, 5];
  List<int> squared = numbers.map((num) => num * num).toList();
  print('数字平方: $squared');

  // 函数作为参数
  void processList(List<int> list, int Function(int) operation) {
    for (int i = 0; i < list.length; i++) {
      list[i] = operation(list[i]);
    }
  }

  processList(numbers, (num) => num * 10);
  print('处理后的数字: $numbers');
}

/// 四、集合操作示例
void collectionOperations() {
  print('\n--- 集合操作 ---');

  // 列表(List)操作
  List<String> tasks = ['学习Dart', '编写代码', '测试程序'];
  print('初始任务列表: $tasks');

  // 添加元素
  tasks.add('优化代码');
  tasks.addAll(['文档编写', '代码审查']);
  print('添加后: $tasks');

  // 插入元素
  tasks.insert(1, '设计方案');
  print('插入后: $tasks');

  // 删除元素
  tasks.remove('测试程序');
  tasks.removeAt(2);
  print('删除后: $tasks');

  // 查找元素
  bool hasTask = tasks.contains('学习Dart');
  print('包含"学习Dart": $hasTask');

  int index = tasks.indexOf('编写代码');
  print('"编写代码"的索引: $index');

  // 遍历列表
  print('遍历任务列表:');
  tasks.forEach((task) => print('- $task'));

  // 集合(Set)操作
  Set<String> uniqueTasks = {'学习', '编码', '测试', '测试', '部署'};
  print('初始集合: $uniqueTasks');

  // 集合操作
  Set<String> moreTasks = {'编码', '文档', '评审'};
  uniqueTasks.addAll(moreTasks); // 并集
  print('并集: $uniqueTasks');

  uniqueTasks.retainWhere((task) => task != '编码'); // 差集
  print('差集: $uniqueTasks');

  // 映射(Map)操作
  Map<String, double> prices = {'苹果': 5.5, '香蕉': 3.2, '橙子': 4.8};
  print('初始价格表: $prices');

  // 添加/修改映射项
  prices['葡萄'] = 8.0;
  prices['苹果'] = 6.0;
  print('更新后: $prices');

  // 获取映射值
  double applePrice = prices['苹果'] ?? 0.0;
  print('苹果价格: $applePrice 元');

  // 遍历映射
  print('价格表详情:');
  prices.forEach((fruit, price) {
    print('$fruit: $price 元/斤');
  });
}

/// 五、异步编程示例
void asyncProgramming() async {
  print('\n--- 异步编程 ---');
  print('开始执行异步操作...');

  // 1. Future 基础用法
  Future<String> fetchData() {
    return Future.delayed(const Duration(seconds: 1), () {
      return '成功获取数据';
    });
  }

  // 使用 async/await
  String result = await fetchData();
  print(result);

  // 使用 then/catchError/whenComplete
  fetchData()
      .then((value) => print('通过 then 得到: $value'))
      .catchError((error) => print('错误: $error'))
      .whenComplete(() => print('Future 操作完成'));

  // 2. Stream 基础用法
  Stream<int> countStream() {
    return Stream.periodic(const Duration(seconds: 1), (i) {
      return i + 1;
    }).take(3); // 只发送3个数据
  }

  // 订阅 Stream
  StreamSubscription<int> subscription = countStream().listen(
    (data) => print('收到数据流: $data'),
    onError: (error) => print('Stream 错误: $error'),
    onDone: () => print('Stream 发送完成'),
  );

  // 等待一段时间让 Stream 完成
  await Future.delayed(const Duration(seconds: 4));

  // 取消订阅
  subscription.cancel();
  print('Stream 订阅已取消');
}

/// 六、数学计算示例
void mathCalculations() {
  print('\n--- 数学计算 ---');

  // 数学常数
  print('π: ${pi}');
  print('自然常数e: ${e}');
  print('√2: ${sqrt(2)}');

  // 数值计算
  int a = 25;
  int b = 6;

  print('$a 的绝对值: ${(a)}');
  print('$a 和 $b 的最大值: ${max(a, b)}');
  print('$a 和 $b 的最小值: ${min(a, b)}');
  print('$a 除以 $b 的商: ${a / b}');
  print('$a 除以 $b 的余数: ${a % b}');
  print('$a 的平方: ${pow(a, 2)}');
  print('$a 的平方根: ${sqrt(a)}');

  // 三角函数
  double radians = pi / 4; // 45度
  print('$radians 弧度的正弦值: ${sin(radians)}');
  print('$radians 弧度的余弦值: ${cos(radians)}');
  print('$radians 弧度的正切值: ${tan(radians)}');

  // 随机数生成
  Random random = Random();
  int randomNum = random.nextInt(100); // 0-99的随机数
  print('随机数: $randomNum');

  // 四舍五入
  double number = 3.14159;
  print('$number 保留两位小数: ${number.toStringAsFixed(2)}');
  print('$number 四舍五入: ${number.round()}');
}
